package main

import (
	"fmt"
	"gitee.com/masaichi/mastool/pipe"
)

func main() {
	//testV2()
	testV3()
}

// 爬虫伪代码
func testV3() {
	pi := pipe.NewPipe()
	out := pi.PipeDo(func(in pipe.InChan) {
		//获取页数，将页数放入管道，由worker进行处理
		for i := 1; i <= 3; i++ {
			in <- i
		}
	}, func(item interface{}) interface{} {
		//断言数据类型
		page, ok := item.(int)
		if !ok {
			//断言失败，需要处理
		}
		//进行页数爬取
		//将数据返回
		return page
	}, pipe.WithPipeCount(5))
	fmt.Println("pi:", pi)
	for v := range out {
		fmt.Println("out:", v)
	}
}

// 建议使用v2
func testV2() {
	pi := pipe.NewPipe()
	totalNum := 10
	//注意，切片是没有顺序的
	out := pi.PipeDo(func(in pipe.InChan) {
		//把数据塞进管道
		for i := 0; i <= totalNum; i++ {
			in <- i
		}
	}, func(item interface{}) interface{} {
		//这个函数是会把返回值塞进管道
		//需要先断言类型，再进行处理
		//这里的函数是将每个数乘以10
		return item.(int) * 10
	}, pipe.WithPipeCount(5))
	arr := []int{}
	for v := range out {
		//这里将数据整合
		arr = append(arr, v.(int))
	}
	//输出
	fmt.Println("arr:", arr)
}

func testV1() {
	pi := pipe.NewPipeV1()
	//生产者
	pi.SetProducer(func(args ...interface{}) pipe.InChanV1 {
		in := make(pipe.InChanV1, 0)
		go func() {
			defer close(in)
			for i := 0; i <= 80; i++ {
				in <- i
			}
		}()
		return in
	})
	//设置消费者
	pi.SetConsumer(func(in pipe.InChanV1) pipe.OutChanV1 {
		out := make(pipe.OutChanV1, 0)
		go func() {
			defer close(out)
			for d := range in {
				//断言,这块是处理逻辑
				d = d.(int) * 10
				out <- d
			}
		}()
		return out
	}, 5)

	out := pi.Excute()
	for v := range out {
		fmt.Println(v)
	}
}
